<?php
namespace App\Services\System\Permission;

use Illuminate\Support\Arr;
use App\Services\ServiceTrait;
use App\Models\Game\Platform\Org;
use App\Models\Admin\Auth\Permission\Tree;

class TreeOrgService
{
    use ServiceTrait;

    /**
     * 获取授权平台集合
     *
     * @param int $treeId
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function getOrgs($treeId)
    {
        if ($treeId == 0) {
            return Org::selectAll();
        }

        $orgIds = Tree::findOrFail($treeId)->orgs->pluck('id');

        return Org::makeAllOrgs($orgIds->toArray());
    }

    /**
     * 更新授权平台
     *
     * @param int $treeId
     * @param \Illuminate\Http\Request $request
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public function update($treeId, $request)
    {
        // 事物回滚
        return Tree::dbConnection()->transaction(function () use ($treeId, $request) {
            // 查询授权树
            $tree = Tree::findOrFail($treeId);

            // 平台ID【之前的】
            $orgIdsOld = $tree->orgs->pluck('id')->all();
            // 平台ID【之后的】
            $orgIdsNew = Arr::wrap($request->input('orgs.ids'));

            // 平台ID【移除关联】
            $orgIdsDetach = array_diff($orgIdsOld, $orgIdsNew);
            // 平台ID【添加关联】
            $orgIdsAttach = array_diff($orgIdsNew, $orgIdsOld);

            // 移除关联
            $tree->orgs()->detach($orgIdsDetach);
            // 添加关联
            $tree->orgs()->attach($orgIdsAttach);

            // 授权平台更新完成
            \App\Events\System\Permission\TreeOrg\Updated::dispatch($tree, $orgIdsDetach, $orgIdsAttach, $orgIdsOld, $orgIdsNew);

            // 动态属性已经加载，更新后需重新加载
            return $tree->orgs()->get();
        });
    }
}
